package com.bw.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bw.entity.User;
import com.bw.mapper.UserMapper;
import org.spring.kun.common.GiteeUtils;
import org.spring.kun.common.JwtUtils;
import org.spring.kun.common.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

@Controller
public class GiteeLoginController {

    @Autowired
    UserMapper userMapper;

    @RequestMapping("/callbackCode.do")
    public String callback(String code, HttpServletResponse response, Model model) {
        System.out.println("接收到的临时授权码 " + code);

        String tokenByCode = GiteeUtils.getAccessTokenByCode(code);
        System.out.println("根据临时授权码获取到的token " + tokenByCode);

        JSONObject userInfoByToken = GiteeUtils.getGiteeUserInfoByToken(tokenByCode);
        System.out.println("根据token 获取到的用户信息 " + JSON.toJSONString(userInfoByToken));

        // 从gitee用户信息中  选择4个字段进行注册
        String name = userInfoByToken.getString("login"); // 把gitee用户的个人空间地址信息 当做 自己系统的用户名
        Integer giteeId = userInfoByToken.getInteger("id"); //把gitee用户的主键ID 当做自己系统的giteeId
        String nickName = userInfoByToken.getString("name"); // 把gitee用户的姓名 当做自己系统的昵称
        String avatarUrl = userInfoByToken.getString("avatar_url"); // 把gitee用户的头像 当做自己系统的头像

        // 判断之前是否已经注册过用户
        User userDB = userMapper.selectByName(name);
        if (userDB == null){
            userDB = new User();
            userDB.setName(name);
            userDB.setGiteeId(giteeId);
            userDB.setAvatarUrl(avatarUrl);
            userDB.setNickName(nickName);
            userMapper.addUser(userDB);
        }else {  //如果之前已经注册过， 更新一下用户的昵称和头像
            userDB.setNickName(nickName);
            userDB.setAvatarUrl(avatarUrl);
            userMapper.updateUserById(userDB);
        }

        // 加密用户信息 得到token,设置30分钟有效期  把token放入cookie  cookie过期时间也是30a分钟 把cookie返回给浏览器
        TokenUtils.responseTokenByCookie(userDB,response,30);


        //  登录成功去列表页  在列表页展示昵称和头像
        return "redirect:list.do";  // 告诉浏览器去访问list.do
       // return "list";  // 返回一个页面给浏览器

    }

}
